package program_structure;

import java.util.Random;
import java.util.Scanner;

/**
 * @author yuisama
 * @date 2022/08/19 09:33
 * 程序结构部分作业
 **/
public class ProgramStructureHomeWork {
    public static void main(String[] args) {
        // 1.打印 1 - 100 之间所有的素数(素数指的是除了1和他本身，再没有任何因子的数)
        // 统计素数的个数
//        int primeNum = 0;
//        // 最外层循环表示依次从1 - 100
//        for (int i = 2; i < 101; i++) {
//            // 引入标志位最后判断是否是素数之后，根据这个变量决定是否输出i
//            // 假设每次这个i都是素数
//            boolean isPrime = true;
//            // 需要判断当前的i是否是素数 ...
//            // 从j = 2开始，一直走到i- 1，不断尝试用i / j 查看是否能够整除，若能整除，说明此时j就是i的一个因子 ！！找到反例
//            for (int j = 2; j < i; j++) {
//                if (i % j == 0) {
//                    // 此时j就是i的一个因子！！！,此时i一定不是素数，内层循环退出
//                    isPrime = false;
//                    break;
//                }
//            }
//            // 若没有这个标志位，代码走到这里，你能知道这个i是不是素数? => 1.内层循环找到了因子退出的，i不是素数
//            // => 没有找到因子，内层循环走完自己结束，i是素数  =》   无论上述哪种情况，代码都走到了这里
//            // 知道当前这个i是不是素数
//            if (isPrime) {
//                System.out.print(i + "、");
//                primeNum ++;
//            }
//        }
//        System.out.println();
//        System.out.println("1-100之间一共有 : " + primeNum + "个素数");
        // 2.编写程序数一下 1到 100 的所有整数中出现多少个数字9
        // 1-100中出现9的只有可能出现在个位或者十位
        // 99 这个数字，到底应该算1次还是两次？ =》题目让你统计数字9出现的次数而不是出现了数字9的数字
//        int nineNum = 0;
//        for (int i = 1; i < 101; i++) {
//            // 个位出现数字9的情况
//            if (i % 10 == 9) {
//                // 个位出现了数字9   19 % 10 == 9  9 % 10 == 9
//                nineNum ++;
//            }
//            // 继续统计十位出现数字9的情况  91 / 10 int/int = int这个特性 /10相当于抛弃了个位！
//            if (i / 10 == 9) {
//                nineNum ++;
//            }
//        }
//        System.out.println("1-100一共出现了" + nineNum + "个数字9");
        // 3.给定两个数，求这两个数的最大公约数
        // ***欧几里得算法辗转相除法***  => LeetCode走圈问题
        Scanner scanner = new Scanner(System.in);
//        int a = scanner.nextInt();
//        int b = scanner.nextInt();
//        int max = a > b ? a : b;  Math.max(a,b);
//        int min = Math.min(a, b); // 画黄波浪线，就是IDEA有话要说。
//        while (min > 0) {
//            int tmp = max % min;
//            max = min;
//            min = tmp;
//        }
//        System.out.println("最大公约数为 : " + max);

        // 4.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
//        double sum = 0.0;
//        // 巧妙使用标志位,就是来表示正负的
//        int flag = 1;
//        for (int i = 1; i < 101; i++) {
//            sum = sum + (1.0 / i) * flag;
//            // 下次循环的时候，正负就变了~
//            flag = -flag;
//        }
//        System.out.println(sum);
        // 5.求出0～n之间的所有“水仙花数”并输出。
        // (“水仙花数”是指一个三位数 100-999，
        // 其各位数字的立方和确好等于该数本 身，如；153＝1^3＋5^3＋3^3，则153是一个“水仙花数“。）
//        for (int i = 100; i < 1000; i++) {
//            int geWei = i % 10;
//            int baiWei = i / 100; // 只保留百位 121 / 100 = 1
//            // 132  => 个位扔了再%10  132 / 10 = 13 % 10 = 3
//            int shiWei = i / 10 % 10;
//            int sum = geWei * geWei * geWei
//                    + shiWei * shiWei * shiWei
//                    + baiWei * baiWei * baiWei;
//            if (i == sum) {
//                System.out.print(i + "、");
//            }
//        }
        // 6.完成猜数字游戏 ，用户输入数字，判断该数字是大于，小于，还是等于随机生成的数字，等于的时候退出程序。
        // 生成随机数,先使用古老的Random类
        Random random = new Random();
        // 不传参就是在正整数范围内随机生成一个数，传递参数，就是从0 - 参数范围内
        int toGus = random.nextInt(100);
        System.out.println("随机生成的数为 : " + toGus);
        while (true) {
            System.out.println("请输入您要猜的数字");
            int gus = scanner.nextInt();
            if (gus < toGus) {
                System.out.println("小了~");
            }else if (gus > toGus) {
                System.out.println("大了~");
            }else {
                System.out.println("Bingo~");
                break;
            }
        }
    }
}